package br.uniriotec.pm.domain;

import java.math.BigDecimal;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
import com.thoughtworks.xstream.annotations.XStreamImplicit;

@XStreamAlias("registro-preco")
public class RegistroPreco implements Comparable<RegistroPreco> {
	@XStreamAlias("codigo")
	@XStreamAsAttribute
	private Long codigo;
	
	@XStreamAlias("data")
	@XStreamAsAttribute
	private Calendar data;
	
	@XStreamImplicit(keyFieldName="produto", itemFieldName="preco")
	private Map<Produto, BigDecimal> mapaPrecos;
	
	public RegistroPreco() {
		super();
		this.mapaPrecos = new HashMap<Produto, BigDecimal>();
	}

	public RegistroPreco(Long codigo) {
		super();
		this.codigo = codigo;
		this.mapaPrecos = new HashMap<Produto, BigDecimal>();
	}

	public RegistroPreco(Long codigo, Calendar data) {
		super();
		this.codigo = codigo;
		this.data = data;
		this.mapaPrecos = new HashMap<Produto, BigDecimal>();
	}

	public Long getCodigo() {
		return this.codigo;
	}

	public void setCodigo(Long codigo) {
		this.codigo = codigo;
	}

	public Calendar getData() {
		return this.data;
	}

	public void setData(Calendar data) {
		this.data = data;
	}
	
	public Map<Produto, BigDecimal> getMapaPrecos() {
		return this.mapaPrecos;
	}

	public void setMapaPrecos(Map<Produto, BigDecimal> mapaPrecos) {
		this.mapaPrecos = mapaPrecos;
	}

	public BigDecimal putPreco(Produto produto, BigDecimal preco) {
		return this.mapaPrecos.put(produto, preco);
	}
	
	public BigDecimal removePreco(Produto produto) {
		return this.mapaPrecos.remove(produto);
	}
	
	public BigDecimal getPreco(Produto produto) {
		return this.mapaPrecos.get(produto);
	}
	
	public Set<Produto> getConjuntoProdutos() {
		return this.mapaPrecos.keySet();
	}
	
	public boolean possuiPrecoProduto(Produto produto) {
		return this.mapaPrecos.containsKey(produto);
	}
	
	public int totalPrecos() {
		return this.mapaPrecos.size();
	}

	@Override
	public int compareTo(RegistroPreco o) {
		return o.getCodigo().compareTo(this.codigo);
	}
	
	@Override
	public int hashCode() {
		return this.codigo.hashCode();
	}
}
